package com.zzl.java8.czbk.stream.test1;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

/**
 * description: Stream入门
 * @author 朱正磊
 * @date 2022-06-16 13:28:46
 */
public class StreamFirstTest1 {

    /**
     * description: 使用传统方法对数组元素进行多次操作，缺点是需要多次循环遍历，性能较差
     * @author 朱正磊
     * @date 2022-06-16 15:36:50
     */
    @Test
    void test1() {
        // 在数组中有一堆字符串
        String[] strings = new String[]{"hello", "www", "pbteach", "com"};

        // 找到长度大于4的字符串
        List<String> listFilter = new ArrayList<>();
        for (String string : strings) {
            if (string.length() > 4) {
                listFilter.add(string);
            }
        }

        // 将长度大于4的字符串转成大写字母
        List<String> listUpperCase = new ArrayList<>();
        listFilter.forEach(x -> {
            String upperCase = x.toUpperCase();
            listUpperCase.add(upperCase);
        });

        // 将转成大写字母的字符串遍历输出到控制台
        listUpperCase.forEach(System.out::println);
    }

    /**
     * description: 使用传统方法对数组元素进行多次操作，缺点是修改一处需求就会动全身，稳定性较差，健壮性较差，不易维护，而且可阅读性较差
     * @author 朱正磊
     * @date 2022-06-16 15:38:41
     */
    @Test
    void test2() {
        // 在数组中有一堆字符串
        String[] strings = new String[]{"hello", "www", "pbteach", "com"};

        for (String string : strings) {
            if (string.length() > 4) {
                String upperCase = string.toUpperCase();
                System.out.println(upperCase);
            }
        }
    }

    /**
     * 说明：for循环是一种外部迭代方式，Stream流是一种内部迭代方式
     * description: 使用Stream流类库对数组或者集合元素进行多步操作
     * @author 朱正磊
     * @date 2022-06-16 15:39:53
     */
    @Test
    void test3() {
        // 在数组中有一堆字符串
        String[] strings = new String[]{"hello", "www", "pbteach", "com"};

        // Stream流式编程（链式编程）
        Stream.of(strings).filter(x -> x.length() > 4).map(String::toUpperCase).forEach(System.out::println);
    }

}
